/**
 *	@file	fld_mushitori_st.c
 *	@brief	虫取り大会ワーク操作　常駐ソース
 *	@author	Miyuki Iwasawa
 *	@date	09.03.04
 */

#include "common.h"

#include "fieldsys.h"

#include "system/mystatus.h"
#include "poketool/poke_tool.h"

#include "field_subproc.h"
#include "field/field.h"
#include "field/situation_local.h"
#include "field/script.h"
#include "field/syswork.h"
#include "field/fld_bgm.h"
#include "fieldmap.h"
#include "map_attr.h"
#include "zonedata.h"
#include "map_tool.h"
#include "scr_tool.h"
#include "sysflag.h"
#include "field_subproc.h"
#include "ev_mapchange.h"
#include "fielddata/maptable/zone_id.h"
#include "fld_mushitori.h"

typedef struct{
	int seq;
	POKEMON_PARAM* btl_pp;
	BUG_SELECT_PROC_PARAM* bsp;

}EV_BUGSEL_WORK;

static BOOL GMEVENT_BugSelect(GMEVENT_CONTROL * event);

/**
 *	@brief	虫取りワークへのポインタを取得する
 */
FLD_MUSHITORI_WORK* MushitoriSysSt_GetWorkPointer(FIELDSYS_WORK* fsys)
{
	return (FLD_MUSHITORI_WORK*)fsys->mushitori_wk;
}

/*
 *	@brief	現在の残りボール数格納ワークへのポインタを返す
 */
u16* MushitoriSysSt_GetBallNumPointer(FLD_MUSHITORI_WORK* wk)
{
	return &wk->ball_num;
}

/**
 *	@brief	大会の経過時間監視
 */
void MushitoriSysSt_UpdateTimeCounter(FIELDSYS_WORK* fsys,s32 diff_minute)
{
	FLD_MUSHITORI_WORK* wk = MushitoriSysSt_GetWorkPointer(fsys);

	if(wk == NULL){
		return;
	}
	if(SysFlag_MushitoriCheck(SaveData_GetEventWork(fsys->savedata))){
		wk->time += diff_minute;
	}
}

/**
 *	@brief	閉会式会場ロケーションをセット
 */
void EventCmd_MushitoriCeremonyLocationSet(GMEVENT_CONTROL* event,FIELDSYS_WORK* fsys)
{
	//コンペボールがなくなったら閉会式会場へ戻す
	LOCATION_WORK lw;
	SITUATION *sit = SaveData_GetSituation(fsys->savedata);

	lw.zone_id	= ZONE_ID_D22R0101;
    lw.door_id	= DOOR_ID_JUMP_CODE;
    lw.grid_x	= 46;
    lw.grid_z	= 50;
    lw.dir		= DIR_UP;

    Situation_SetSpecialLocation( sit, &lw );
	EventCmd_MapChangeByLocation(event,	Situation_GetSpecialLocation(sit));
}

//-----------------------------------------------------------------------------
/**
 * @brief	イベント擬似コマンド：虫さん選択アプリ呼び出し
 * @param	event		イベント制御ワークへのポインタ
 */
//-----------------------------------------------------------------------------
void EventCmd_BugSelect(GMEVENT_CONTROL * event,POKEMON_PARAM* btl_pp)
{
	EV_BUGSEL_WORK * ebw = sys_AllocMemoryLo(HEAPID_BASE_APP, sizeof(EV_BUGSEL_WORK));

	MI_CpuClear8(ebw,sizeof(EV_BUGSEL_WORK));

	ebw->btl_pp = btl_pp;
	FieldEvent_Call(event, GMEVENT_BugSelect, ebw);
}

//-----------------------------------------------------------------------------
/**
 * @brief	虫取り大会 虫さん選択アプリ呼び出しシーケンス
 * @param	event		イベント制御ワークへのポインタ
 * @retval	TRUE		イベント終了
 * @retval	FALSE		イベント継続中
 *
 * サブイベントとして、サファリイベントシーケンスをコールする
 */
//-----------------------------------------------------------------------------
static BOOL GMEVENT_BugSelect(GMEVENT_CONTROL * event)
{
	FIELDSYS_WORK * fsys;
	EV_BUGSEL_WORK * ebw;
	FLD_MUSHITORI_WORK * msys;
	int* seq;

	fsys = FieldEvent_GetFieldSysWork(event);
	ebw = FieldEvent_GetSpecialWork(event);
	msys = MushitoriSysSt_GetWorkPointer(fsys);

	seq = FieldEvent_GetSeqWork(event);

    switch (*seq) {
	case 0:
		ebw->bsp = FieldBugSelect_SetProc(fsys,ebw->btl_pp,msys->fld_pp,!msys->get_f);
		(*seq)++;
		break;
	case 1:
		//プロセス終了待ち
		if(FieldEvent_Cmd_WaitSubProcEnd(fsys)){
			break;
		}
		//バトル側が選ばれた場合、フィールドに保存
		if(ebw->bsp->pResPoke != msys->fld_pp){
			PokeCopyPPtoPP(ebw->btl_pp,msys->fld_pp);
		}
		if(!msys->get_f){	//ここでフラグたてておく
			msys->get_f = TRUE;
		}
		sys_FreeMemoryEz(ebw->bsp);
		sys_FreeMemoryEz(ebw);
		return TRUE;
	}
	return FALSE;
}
